package br.com.os2.pacemark.dao;

import br.com.os2.pacemark.model.Implante;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * Classe ImplanteDAO, extende a classe DAOGenerico para obeter 
 * recursos de conexão e excução de consultas e comandos.
 * 
 * Responsável por gerenciar acesso ao banco de dados relacionados a 
 * Entidade Implante.
 * 
 * @author Daniel
 * 
 */
public class ImplanteDAO extends DAOGenerico {
   
    /**
     * Método para inserir um implante.
     * 
     * @param implante Objeto implante a ser inserido.
     * @return boolean indica se o método foi executado com sucesso.
     * 
     **/
    
    public boolean inserir(Implante implante){
     
        implante.setId(getNextId("implantes"));
        
        return executarComando("INSERT INTO implantes (id, data, paciente_id, medico_id, "
                             + "hospital_id, indicacao_clinica_id) VALUES (?,?,?,?,?,?)"
                             , implante.getId()
                             , new java.sql.Date(implante.getData().getTime()), implante.getPaciente().getId()
                             , implante.getMedico().getId(), implante.getHospital().getId()
                             , implante.getIndicacaoClinica().getId());
        
    }
    
    /**
     * Método para atualizar informações de um implante.
     * 
     * @param implante Objeto implante a ser atualizado.
     * @return boolean indica se o método foi executado com sucesso
     * 
     **/
    
    public boolean atualizar(Implante implante){
     
        return executarComando("UPDATE implantes SET data = ?, paciente_id = ?, "
                             + "medico_id = ?, hospital_id = ?, indicacao_clinica_id = ? "
                             + "WHERE id = ?"
                             , new java.sql.Date(implante.getData().getTime()), implante.getPaciente().getId()
                             , implante.getMedico().getId(), implante.getHospital().getId()
                             , implante.getIndicacaoClinica().getId());
        
    }
    
    /**
     * Método para excluir um implante.
     * 
     * @param implante Objeto implante a ser excluído.
     * @return boolean indica se o método foi executado com sucesso
     * 
     **/
    
    public boolean excluir(Implante implante){
    
        return executarComando("DELETE FROM implantes WHERE id = ?", implante.getId());
        
    }
    
    /**
     * Método para excluir um implante.
     * 
     * @param id ID do objeto a ser excluído
     * @return boolean indica se o método foi executado com sucesso
     * 
     **/
    
    public boolean excluir(int id){
    
        return executarComando("DELETE FROM implantes WHERE id = ?", id);
        
    }
    
    /**
     * Método para buscar o implante pelo ID
     * 
     * @return Implante correspondente ai ID, se não for encontrado retorna null.
     * 
     * @param id inteiro que representa o ID do implante na tabela
     * 
     **/
    
    public Implante getById(int id){
    
        ResultSet rs = executarConsulta("SELECT * FROM implantes WHERE id = ?", id);
        
        Implante implante = null;
        
        try {
            
            PacienteDAO pacienteDAO = new PacienteDAO();
            MedicoDAO medicoDAO = new MedicoDAO();
            HospitalDAO hospitalDAO = new HospitalDAO();
            IndicacaoClinicaDAO indicacaoClinicaDAO = new IndicacaoClinicaDAO();
            
            if(rs.next()){
                
                implante = polularInformacoes(rs, pacienteDAO, medicoDAO,
                                                 hospitalDAO, indicacaoClinicaDAO);
                
            }
            
        } catch (SQLException ex) {
            
            System.err.println("ERRO AO BUSCAR IMPLANTE POR ID");
            
        }finally{
            
            try {
                
                rs.close();
                connection.close();
                
            } catch (SQLException ex) {
                
                
                
            }
            
        }
        
        return implante;
        
    }
    
    /**
     * Método para listagem de implantes.
     * 
     * @return Retorna uma lista de implantes com o resultado da consulta
     * 
     **/
    
    public List<Implante> listar(){
    
        List<Implante> implantes = new ArrayList<>();
        
        ResultSet rs = executarConsulta("SELECT * FROM implantes");
        
        try {
            
            PacienteDAO pacienteDAO = new PacienteDAO();
            MedicoDAO medicoDAO = new MedicoDAO();
            HospitalDAO hospitalDAO = new HospitalDAO();
            IndicacaoClinicaDAO indicacaoClinicaDAO = new IndicacaoClinicaDAO();
            
            while(rs.next()){
                
                implantes.add(polularInformacoes(rs, pacienteDAO, medicoDAO,
                                                 hospitalDAO, indicacaoClinicaDAO));
                
            }
            
        } catch (SQLException ex) {
            
            System.err.println("ERRO AO PERCORER RESULT_SET");
            
        }finally{
            
            try {
                
                rs.close();
                connection.close();
                
            } catch (SQLException ex) {
                
                
                
            }
            
        }
            
        return implantes;
        
    }
    
    /**
     * Método para preencher informações de um implante com resultados do 
     * banco de dados.
     * 
     * @param rs ResultSet com o resultado de uma consulta SQL
     * 
     * @param pacienteDAO DAO de Paciente
     * 
     * @param medicoDAO DAO de Médico
     * 
     * @param hospitalDAO DAO de Hospital
     * 
     * @param indicacaoClinicaDAO DAO de Indicaçao Clinica
     * 
     * @return Retorna um implante populado com informações vindas do banco de 
     *  dados
     * 
     **/
    
    public Implante polularInformacoes(ResultSet rs, PacienteDAO pacienteDAO, 
                                       MedicoDAO medicoDAO, HospitalDAO hospitalDAO,
                                       IndicacaoClinicaDAO indicacaoClinicaDAO){
    
        Implante implante = new Implante();
        
        try {
            
            implante.setId(rs.getInt("id"));
            implante.setData(rs.getDate("data"));
            implante.setPaciente(pacienteDAO.getById(rs.getInt("paciente_id")));
            implante.setMedico(medicoDAO.getById(rs.getInt("medico_id")));
            implante.setHospital(hospitalDAO.getById(rs.getInt("hospital_id")));
            implante.setIndicacaoClinica(indicacaoClinicaDAO.getById(rs.getInt("indicacao_clinica_id")));
            
        } catch (SQLException ex) {
            
            System.err.println("ERRO AO PULULAR IMPLANTE");
            
        }
        
        return implante;
        
    }
    
}
